12.5.3 ゴルーチンの終了チェック
ゴルーチンとして実行される関数を起動する際は確実に終了するようにしなければならない
変数と違い、Goのランタイムはあるゴルーチンが「今後使われることのないもの」か検出できない
ゴルーチンが終了しない場合、スタック状の変数に割り当てられた全てのメモリは割り当てられたままの状態になり、変数から参照されているヒープ上のメモリはGCできない。これをゴルーチンリーク(goroutine leak)と呼ぶ
code:go
package main
import (
"fmt"
)
func countTo(max int) <-chan int {
ch := make(chan int)
go func() {
for i := 0; i < max; i++ {
ch <- i // 0からmax-1までの値を順にchに入れようとするが、
// 6を入れたあとは、読み込んでもらえなくなる
}
close(ch)
}()
return ch
}
func main() {
for i := range countTo(10) { //countToからチャネルが戻り、0...9が代入される
fmt.Println(i)
if i > 5 {
break
}
}
fmt.Println("main終了")
}